{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 随机梯度下降法实战\n",
    "## 1.构建数据集\n",
    "$ y = 2 * x $"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,\n",
       "       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,\n",
       "       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.arange(0,50)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.82977995,  2.20324493, -4.99885625, -1.97667427, -3.53244109,\n",
       "       -4.07661405, -3.13739789, -1.54439273, -1.03232526,  0.38816734,\n",
       "       -0.80805486,  1.852195  , -2.9554775 ,  3.78117436, -4.72612407,\n",
       "        1.7046751 , -0.82695198,  0.58689828, -3.59613061, -3.01898511,\n",
       "        3.00744569,  4.68261576, -1.86575822,  1.92322616,  3.76389152,\n",
       "        3.94606664, -4.14955789, -4.60945217, -3.3016958 ,  3.78142503,\n",
       "       -4.01653166, -0.78892375,  4.5788953 ,  0.33165285,  1.91877114,\n",
       "       -1.84484369,  1.86500928,  3.34625672, -4.81711723,  2.50144315,\n",
       "        4.88861089,  2.48165654, -2.19556008,  2.89279328, -3.96773993,\n",
       "       -0.52106474,  4.08595503, -2.06385852, -2.12224661, -3.69971428])"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# [-5,5)\n",
    "np.random.seed(1)\n",
    "RandomArray = (np.random.random(50)*2-1)*5\n",
    "RandomArray"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.82977995,  4.20324493, -0.99885625,  4.02332573,  4.46755891,\n",
       "        5.92338595,  8.86260211, 12.45560727, 14.96767474, 18.38816734,\n",
       "       19.19194514, 23.852195  , 21.0445225 , 29.78117436, 23.27387593,\n",
       "       31.7046751 , 31.17304802, 34.58689828, 32.40386939, 34.98101489,\n",
       "       43.00744569, 46.68261576, 42.13424178, 47.92322616, 51.76389152,\n",
       "       53.94606664, 47.85044211, 49.39054783, 52.6983042 , 61.78142503,\n",
       "       55.98346834, 61.21107625, 68.5788953 , 66.33165285, 69.91877114,\n",
       "       68.15515631, 73.86500928, 77.34625672, 71.18288277, 80.50144315,\n",
       "       84.88861089, 84.48165654, 81.80443992, 88.89279328, 84.03226007,\n",
       "       89.47893526, 96.08595503, 91.93614148, 93.87775339, 94.30028572])"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = 2 *X +RandomArray\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'matplotlib'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-2-19701bc457bc>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m  \u001b[1;31m# pip install matplotlib\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'matplotlib'"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt  # pip install matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'plt' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-1-8c4bb2934afc>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'plt' is not defined"
     ]
    }
   ],
   "source": [
    "plt.scatter(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((50,), (50,))"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape,y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = X.reshape(50,1)\n",
    "y = y.reshape(50,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.        , -0.82977995],\n",
       "       [ 1.        ,  4.20324493],\n",
       "       [ 2.        , -0.99885625],\n",
       "       [ 3.        ,  4.02332573],\n",
       "       [ 4.        ,  4.46755891],\n",
       "       [ 5.        ,  5.92338595],\n",
       "       [ 6.        ,  8.86260211],\n",
       "       [ 7.        , 12.45560727],\n",
       "       [ 8.        , 14.96767474],\n",
       "       [ 9.        , 18.38816734],\n",
       "       [10.        , 19.19194514],\n",
       "       [11.        , 23.852195  ],\n",
       "       [12.        , 21.0445225 ],\n",
       "       [13.        , 29.78117436],\n",
       "       [14.        , 23.27387593],\n",
       "       [15.        , 31.7046751 ],\n",
       "       [16.        , 31.17304802],\n",
       "       [17.        , 34.58689828],\n",
       "       [18.        , 32.40386939],\n",
       "       [19.        , 34.98101489],\n",
       "       [20.        , 43.00744569],\n",
       "       [21.        , 46.68261576],\n",
       "       [22.        , 42.13424178],\n",
       "       [23.        , 47.92322616],\n",
       "       [24.        , 51.76389152],\n",
       "       [25.        , 53.94606664],\n",
       "       [26.        , 47.85044211],\n",
       "       [27.        , 49.39054783],\n",
       "       [28.        , 52.6983042 ],\n",
       "       [29.        , 61.78142503],\n",
       "       [30.        , 55.98346834],\n",
       "       [31.        , 61.21107625],\n",
       "       [32.        , 68.5788953 ],\n",
       "       [33.        , 66.33165285],\n",
       "       [34.        , 69.91877114],\n",
       "       [35.        , 68.15515631],\n",
       "       [36.        , 73.86500928],\n",
       "       [37.        , 77.34625672],\n",
       "       [38.        , 71.18288277],\n",
       "       [39.        , 80.50144315],\n",
       "       [40.        , 84.88861089],\n",
       "       [41.        , 84.48165654],\n",
       "       [42.        , 81.80443992],\n",
       "       [43.        , 88.89279328],\n",
       "       [44.        , 84.03226007],\n",
       "       [45.        , 89.47893526],\n",
       "       [46.        , 96.08595503],\n",
       "       [47.        , 91.93614148],\n",
       "       [48.        , 93.87775339],\n",
       "       [49.        , 94.30028572]])"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "All_data = np.concatenate((X,y),axis=1)\n",
    "All_data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 划分样本为训练集D和测试集V\n",
    "4:1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.shuffle(All_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 5.        ,  5.92338595],\n",
       "       [29.        , 61.78142503],\n",
       "       [ 9.        , 18.38816734],\n",
       "       [22.        , 42.13424178],\n",
       "       [33.        , 66.33165285],\n",
       "       [16.        , 31.17304802],\n",
       "       [49.        , 94.30028572],\n",
       "       [35.        , 68.15515631],\n",
       "       [31.        , 61.21107625],\n",
       "       [36.        , 73.86500928],\n",
       "       [18.        , 32.40386939],\n",
       "       [14.        , 23.27387593],\n",
       "       [ 4.        ,  4.46755891],\n",
       "       [41.        , 84.48165654],\n",
       "       [27.        , 49.39054783],\n",
       "       [48.        , 93.87775339],\n",
       "       [46.        , 96.08595503],\n",
       "       [26.        , 47.85044211],\n",
       "       [47.        , 91.93614148],\n",
       "       [11.        , 23.852195  ],\n",
       "       [12.        , 21.0445225 ],\n",
       "       [ 2.        , -0.99885625],\n",
       "       [39.        , 80.50144315],\n",
       "       [21.        , 46.68261576],\n",
       "       [20.        , 43.00744569],\n",
       "       [ 6.        ,  8.86260211],\n",
       "       [30.        , 55.98346834],\n",
       "       [44.        , 84.03226007],\n",
       "       [ 0.        , -0.82977995],\n",
       "       [ 3.        ,  4.02332573],\n",
       "       [13.        , 29.78117436],\n",
       "       [17.        , 34.58689828],\n",
       "       [ 1.        ,  4.20324493],\n",
       "       [40.        , 84.88861089],\n",
       "       [24.        , 51.76389152],\n",
       "       [45.        , 89.47893526],\n",
       "       [43.        , 88.89279328],\n",
       "       [28.        , 52.6983042 ],\n",
       "       [ 7.        , 12.45560727],\n",
       "       [25.        , 53.94606664],\n",
       "       [42.        , 81.80443992],\n",
       "       [15.        , 31.7046751 ],\n",
       "       [23.        , 47.92322616],\n",
       "       [10.        , 19.19194514],\n",
       "       [34.        , 69.91877114],\n",
       "       [32.        , 68.5788953 ],\n",
       "       [ 8.        , 14.96767474],\n",
       "       [38.        , 71.18288277],\n",
       "       [19.        , 34.98101489],\n",
       "       [37.        , 77.34625672]])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "All_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data = All_data[:40]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_data = All_data[40:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[ 5.        ,  5.92338595],\n",
       "        [29.        , 61.78142503],\n",
       "        [ 9.        , 18.38816734],\n",
       "        [22.        , 42.13424178],\n",
       "        [33.        , 66.33165285],\n",
       "        [16.        , 31.17304802],\n",
       "        [49.        , 94.30028572],\n",
       "        [35.        , 68.15515631],\n",
       "        [31.        , 61.21107625],\n",
       "        [36.        , 73.86500928],\n",
       "        [18.        , 32.40386939],\n",
       "        [14.        , 23.27387593],\n",
       "        [ 4.        ,  4.46755891],\n",
       "        [41.        , 84.48165654],\n",
       "        [27.        , 49.39054783],\n",
       "        [48.        , 93.87775339],\n",
       "        [46.        , 96.08595503],\n",
       "        [26.        , 47.85044211],\n",
       "        [47.        , 91.93614148],\n",
       "        [11.        , 23.852195  ],\n",
       "        [12.        , 21.0445225 ],\n",
       "        [ 2.        , -0.99885625],\n",
       "        [39.        , 80.50144315],\n",
       "        [21.        , 46.68261576],\n",
       "        [20.        , 43.00744569],\n",
       "        [ 6.        ,  8.86260211],\n",
       "        [30.        , 55.98346834],\n",
       "        [44.        , 84.03226007],\n",
       "        [ 0.        , -0.82977995],\n",
       "        [ 3.        ,  4.02332573],\n",
       "        [13.        , 29.78117436],\n",
       "        [17.        , 34.58689828],\n",
       "        [ 1.        ,  4.20324493],\n",
       "        [40.        , 84.88861089],\n",
       "        [24.        , 51.76389152],\n",
       "        [45.        , 89.47893526],\n",
       "        [43.        , 88.89279328],\n",
       "        [28.        , 52.6983042 ],\n",
       "        [ 7.        , 12.45560727],\n",
       "        [25.        , 53.94606664]]),\n",
       " array([[42.        , 81.80443992],\n",
       "        [15.        , 31.7046751 ],\n",
       "        [23.        , 47.92322616],\n",
       "        [10.        , 19.19194514],\n",
       "        [34.        , 69.91877114],\n",
       "        [32.        , 68.5788953 ],\n",
       "        [ 8.        , 14.96767474],\n",
       "        [38.        , 71.18288277],\n",
       "        [19.        , 34.98101489],\n",
       "        [37.        , 77.34625672]]))"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data,test_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16.51220018240119"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sum(All_data[:,0]*2-All_data[:,1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SGD算法实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 超参\n",
    "lr = 0.001 #学习率\n",
    "N = 100\n",
    "epsilon = 200"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8833060912058098"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 参数\n",
    "theta = np.random.rand()\n",
    "theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(26.0, 47.85044211369778)"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "randint = np.random.randint(0,20)\n",
    "rand_x = train_data[randint][0]\n",
    "rand_y = train_data[randint][1]\n",
    "rand_x,rand_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number:1, theta:1.950388, loss:230.674125\n",
      "Number:2, theta:1.886536, loss:393.837467\n",
      "Number:3, theta:1.944267, loss:240.592880\n",
      "Number:4, theta:2.139221, loss:520.866693\n",
      "Number:5, theta:1.941404, loss:245.648435\n",
      "Number:6, theta:1.974535, loss:203.382100\n",
      "Number:7, theta:1.973175, loss:204.418011\n",
      "Number:8, theta:1.834083, loss:626.666338\n",
      "Number:9, theta:2.133169, loss:493.651579\n",
      "Number:10, theta:1.879218, loss:420.972486\n",
      "Number:11, theta:2.026424, loss:208.629999\n",
      "Number:12, theta:1.959926, loss:217.637769\n",
      "Number:13, theta:2.388964, loss:2678.471453\n",
      "Number:14, theta:1.775833, loss:989.662372\n",
      "Number:15, theta:1.825254, loss:674.617804\n",
      "Number:16, theta:1.918072, loss:296.748563\n",
      "Number:17, theta:2.084681, loss:318.438791\n",
      "Number:18, theta:1.890152, loss:381.070281\n",
      "Number:19, theta:2.076618, loss:296.685396\n",
      "Number:20, theta:2.043440, loss:229.338297\n",
      "Number:21, theta:1.996674, loss:194.955137\n"
     ]
    }
   ],
   "source": [
    "Num = 1\n",
    "theta_list = []\n",
    "loss_list = []\n",
    "while True:\n",
    "    #重新排序D\n",
    "    np.random.shuffle(train_data)\n",
    "    for n in range(N):\n",
    "        # 取随机样本\n",
    "        randint = np.random.randint(0,20)\n",
    "        rand_x = train_data[randint][0]\n",
    "        rand_y = train_data[randint][1]\n",
    "        #计算梯度\n",
    "        grad = rand_x *(rand_x * theta - rand_y)\n",
    "        #更新参数theta\n",
    "        theta = theta - lr * grad\n",
    "    #计算更新theta后的错误率\n",
    "    X = train_data[:,0]\n",
    "    y = train_data[:,1]\n",
    "    loss = np.sum(0.5*(theta*X - y)**2)\n",
    "    print(\"Number:%d, theta:%f, loss:%f\"%(Num,theta,loss))\n",
    "    Num = Num + 1\n",
    "    theta_list.append(theta)\n",
    "    loss_list.append(loss)\n",
    "    if loss < epsilon:\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2287c809608>]"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画图\n",
    "plt.plot(range(len(theta_list)),theta_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2287c894f88>]"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD4CAYAAAAAczaOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dd3xb1f3/8dfHe8QrW3YSkpBA9iIkKSNljzACZXdRoA39AS3hS78USmmhLS0dUAqlUAJhpJRVRsK3YaaUJJCE7EUmmY6dKdlxJNuSpfP7Q1eJSGRbtjWu7M/zkTwkH11Jx7L89tG5536uGGNQSinVMaQluwNKKaUSR0NfKaU6EA19pZTqQDT0lVKqA9HQV0qpDiQj2R1oSteuXU3fvn2T3Q2llEopS5cu3W+M6RbpNluHft++fVmyZEmyu6GUUilFRLY3dptO7yilVAeioa+UUh2Ihr5SSnUgGvpKKdWBaOgrpVQHoqGvlFIdiIa+Ukp1IBr6SqWQfTX1vLu6MtndUClMQ1+pFPLq4h38v5eWUe3xJbsrKkVp6CuVQvYf8gKwq6o2yT1RqUpDX6kU4vIEQ7+yWkNftY6GvlIpxOkOhn5FdV2Se6JSlYa+UimkyprLr9TpHdVKGvpKpZDQSL9SR/qqlTT0lUohoTn9Ch3pq1bS0FcqRdT5/Hi8fkBH+qr1NPSVShGhUX5Rbia7q+sIBEySe6RSkYa+UikiNJ8/tLQQrz/AAetrpVpCQ1+pFOFyB1fuDHEUArpWX7VOs6EvIr1F5GMRWScia0Xkdqv9fhHZJSIrrP+Twu5zj4hsFpENInJ+WPsFVttmEbk7Pt+SUu2T05reGVIaDP2KKp3XVy0XzYnRG4A7jTHLRKQAWCoiH1q3/dkY86fwjUVkCHAtMBQoBT4SkROsm58AzgXKgcUiMssY80UsvhGl2jvX4emdIkBH+qp1mg19Y0wlUGldrxGRdUBZE3eZDLxijKkHtorIZmCcddtmY8wWABF5xdpWQ1+pKIR25Pbvlk9WRpqu4FGt0qI5fRHpC4wGFllNt4nIKhGZLiIlVlsZsDPsbuVWW2PtRz/HFBFZIiJL9u3b15LuKdWuudxeinIzyUxPw1GUo2v1VatEHfoi0gl4A5hqjDkIPAkcD4wi+Eng4dCmEe5ummj/aoMxTxtjxhpjxnbr1i3a7inV7jk9PjrnZwHgKMrRkb5qlahCX0QyCQb+S8aYNwGMMXuMMX5jTACYxpEpnHKgd9jdewEVTbQrpaLgcnspycsEoLQoV+vvqFaJZvWOAM8C64wxj4S1O8I2uxxYY12fBVwrItki0g8YCHwOLAYGikg/EckiuLN3Vmy+DaXaP6fbe2SkX5zDnpp6/HqAlmqhaFbvnAp8B1gtIiustp8B14nIKIJTNNuAmwGMMWtF5DWCO2gbgFuNMX4AEbkNeB9IB6YbY9bG8HtRql1zebwMtZZrOopy8QcMe2vqcBTlJrlnKpVEs3pnPpHn42c3cZ8HgQcjtM9u6n5KqciMMTjdXkqskX5pcQ4QXKuvoa9aQo/IVSoF1Pr81DcEKMkL7cgNBv1u3ZmrWkhDX6kUEKq70zn/yI5c0AO0VMtp6CuVAkJnzAqN9AtzM8jLStdSDKrFNPSVSgFHRvrB0BcRa62+jvRVy2joK5UCQiUYQjtyAUqLc/UE6arFNPSVSgGHR/p5R0LfUZSjB2ipFtPQVyoFuNxe0gQKczMPtzmKctl3qB5vQyCJPVOpRkNfqRTg9HgpzssiPe3IITOlxTkYA3sO6hSPip6GvlIpwOX2UZyX+ZU2x+Flmxr6Knoa+kqlAKfb+5X5fDhyVK6u4FEtoaGvVApwebxfWbkDR0b6ulZftYSGvlIpwOU5dqSfn51BYU6GjvRVi2joK2Vzxhhcbt8xI32w1urrSF+1gIa+Ujbn9vrx+gOH6+6E06NyVUtp6Ctlcy7rwKySvGNH+o7iXF29o1pEQ18pmzu67k640qIcnG4vdT5/orulUpSGvlI254xQdydE1+qrltLQV8rmmp7esdbqaw0eFSUNfaVsLlKxtZDQyVS02qaKloa+Ujbn8nhJTxMKco49pXXPIh3pq5bR0FfK5pxuHyV5maSFFVsLyclMp0t+lo70VdQ09JWyuSqPN+J8foijWNfqq+hp6Ctlc073sXV3wjmKcqnUo3JVlDT0lbK5SHV3wpUW5VChI30VJQ19pWzO2UjdnRBHcS41dQ0cqm9IYK9UqtLQV8rGjDHBkX6EujshDl3Bo1pAQ18pGztY14A/YJrckVtarGv1VfQ09JWysaaOxg3Rkb5qCQ19pWwsVHcnUrG1kB6FOYjoSF9FR0NfKRs7PNJvIvQz09PoXpCtI30VFQ19pWzM5fEBkevuhHMUaV19FZ1mQ19EeovIxyKyTkTWisjtVntnEflQRDZZlyVWu4jIYyKyWURWiciYsMe63tp+k4hcH79vS6n24chIv/HVOwClxbpWX0UnmpF+A3CnMWYwMAG4VUSGAHcDc4wxA4E51tcAFwIDrf9TgCch+EcC+CUwHhgH/DL0h0IpFZnT4yUzXeiUfWyxtXCho3KNMQnqmUpVzYa+MabSGLPMul4DrAPKgMnAC9ZmLwCXWdcnAy+aoIVAsYg4gPOBD40xTmOMC/gQuCCm341S7YzLHay7I3JssbVwjqIcan1+qmt9CeqZSlUtmtMXkb7AaGAR0MMYUwnBPwxAd2uzMmBn2N3KrbbG2o9+jikiskREluzbt68l3VOq3XG6vU2u3Ak5vFZfa/CoZkQd+iLSCXgDmGqMOdjUphHaTBPtX20w5mljzFhjzNhu3bpF2z2l2iVXMxU2Qw6v1dd5fdWMqEJfRDIJBv5Lxpg3reY91rQN1uVeq70c6B12915ARRPtSqlGBCtsNr0TF/SoXBW9aFbvCPAssM4Y80jYTbOA0Aqc64GZYe3ftVbxTACqremf94HzRKTE2oF7ntWmlGqEy+OLaqTftVM2GWmia/VVs5peEhB0KvAdYLWIrLDafgY8BLwmIjcBO4CrrNtmA5OAzYAHuAHAGOMUkV8Di63tfmWMccbku1CqHQoEDFWe6Ob009OEHoU5ulZfNavZ0DfGzCfyfDzA2RG2N8CtjTzWdGB6SzqoVEd1sM5HwDRddyecoyiHCh3pq2boEblK2ZTT3XzdnXCOYj0qVzVPQ18pm3J5mq+7E660KIfd1XUEAnqAlmqchr5SNuV0R1d3J8RRlIPXH+CA9QlBqUg09JWyqWjr7oQ4rGWbulZfNUVDXymbiqaWfrjSIj0qVzVPQ18pm3K5vWRlpJGbmR7V9o5iPSpXNU9DXymbcrq9dI6i2FpIl/wssjLSdAWPapKGvlI25fJ4o165AyAiulZfNUtDXymbcnl8dI5yJ26Io0iPylVN09BXyqZCtfRborQoV+vvqCZp6CtlU84o6+6EcxTnsKemHr8eoKUaoaGvlA01+ANU10ZXYTOcoygXf8Cwt0aneFRkGvpK2VB1rQ9jol+jH1JqLdvUtfqqMRr6StlQS+vuhDiK9Khc1TQNfaVsKFR3pySvZat3QkflVupIXzVCQ18pGwqVVW7pnH5hbgZ5WelU6EhfNUJDXykbcrWw7k5I6AAtHemrxmjoK2VDh+f0WzjSh+BJ0isPauiryDT0lbIhl9tLbmY6uVnRFVsLFxzp6/SOikxDXykbcrp9LZ7aCXEU5bLvUD3ehkCMe6XaAw19pWwoWGytZSt3QkqLczAG9ugUj4pAQ18pG3K2ou5OyJG1+hr66lga+krZkKsVdXdCSvVkKqoJGvpK2VAsRvpaikFFoqGvlM34/AFq6hpaHfr52RkU5mToSF9FpKGvlM0cOTCrdTtyIbhWX0f6KhINfaVsxhWqu9PKOX0InUFLR/rqWBr6StnM4ZF+K6d3ABzFubp6R0Wkoa+UzbjcrSurHK60KAen20udzx+rbql2QkNfKZtxtrLYWjhdq68ao6GvlM2ERvrFLaylH84RWquvNXjUUZoNfRGZLiJ7RWRNWNv9IrJLRFZY/yeF3XaPiGwWkQ0icn5Y+wVW22YRuTv234pS7YPT7aNTdgbZGS0vthYSOplKhY701VGiGek/D1wQof3PxphR1v/ZACIyBLgWGGrd528iki4i6cATwIXAEOA6a1ul1FFcHm+bRvkAPYt0pK8iy2huA2PMXBHpG+XjTQZeMcbUA1tFZDMwzrptszFmC4CIvGJt+0WLe6xUO+d0t74EQ0hOZjpd8rN0pK+O0ZY5/dtEZJU1/VNitZUBO8O2KbfaGms/hohMEZElIrJk3759beieUqnJ5Wl9CYZwjmJdq6+O1drQfxI4HhgFVAIPW+0SYVvTRPuxjcY8bYwZa4wZ261bt1Z2T6nUFYuRPgRX8OhpE9XRWhX6xpg9xhi/MSYATOPIFE450Dts015ARRPtSqmjVHl8MRnplxbl6AnS1TFaFfoi4gj78nIgtLJnFnCtiGSLSD9gIPA5sBgYKCL9RCSL4M7eWa3vtlLtU32Dn0P1DW2quxPiKM6lpq6BQ/UNMeiZai+a3ZErIi8DZwBdRaQc+CVwhoiMIjhFsw24GcAYs1ZEXiO4g7YBuNUY47ce5zbgfSAdmG6MWRvz70apFFflaXvdnRBH2AqegT0K2vx4qn2IZvXOdRGan21i+weBByO0zwZmt6h3SnUwTnfb6+6ElBYfWauvoa9C9IhcpWwkFnV3Qhy6Vl9FoKGvlI2E6u7EYkduj8IcRPSoXPVVGvpK2ciRkX7bd+RmpqfRvSBbR/rqKzT0lbIRZ+gEKjEY6YO1Vl9H+iqMhr5SNuLyeCnIySAzPTa/mqXFulZffZWGvlI24vLE5mjckJ6FwaNyjYl4ALzqgDT0lbIRpzs2dXdCSotzqPX5qa71xewxVWrT0FfKRmI90g+dQatCa/Aoi4a+Ujbicsem7k7I4TNo6by+smjoK2UjwQqbbV+uGaJn0FJH09BXyiZqvX5qfX6KYzjS71aQTUaa6Fp9dZiGvlI24bKOxo3lnH56mtCjMEfX6qvDNPSVsolQsbVYzulDsAZPhY70lUVDXymbiMdIH4J19XWkr0I09JWyCZdVSz+WO3IheAat3dV1BAJ6gJbS0FfKNlxxnN7x+gMcsB5fdWwa+krZhNPtRQSKcmM70ndYJ1PRtfoKNPSVsg2Xx0tRbiYZMSq2FlKqR+WqMBr6StmE0+2NyWkSj6ZH5apwGvpK2YTL46U4L7ZTOwBd8rPIykjTFTwK0NBXyjacbl/Ml2sCiIiu1VeHaegrZROuGJdVDuco0qNyVZCGvlI2YIzBGeOyyuFKi3K1/o4CNPSVsoVanx9vQ4CSOIW+oziHPTX1+PUArQ5PQ18pGwjV3YnH6h0InkzFHzDsrdEpno5OQ18pG3C5gyUY4jXSL7WWbepafaWhr5QNOA8XW4v9kk04ctpEXauvNPSVsoF41d0JCR2VW6kj/Q5PQ18pGzg8px+n6Z3C3AzystKp0JF+h6ehr5QNuDxe0gQKc+IzvRM6QEtH+kpDXykbcLq9FOdlkZYmcXuO0uJcndNXzYe+iEwXkb0isiasrbOIfCgim6zLEqtdROQxEdksIqtEZEzYfa63tt8kItfH59tRKjW5PF5K4lB3J5yjKIcKPSq3w4tmpP88cMFRbXcDc4wxA4E51tcAFwIDrf9TgCch+EcC+CUwHhgH/DL0h0IpZVXYjNN8foijKJf9h+rxNgTi+jzK3poNfWPMXMB5VPNk4AXr+gvAZWHtL5qghUCxiDiA84EPjTFOY4wL+JBj/5Ao1WFVeXxxW7kTUlqcgzGw56CO9juy1s7p9zDGVAJYl92t9jJgZ9h25VZbY+3HEJEpIrJERJbs27evld1TKrUkYqRfVpwHwJpd1XF9HmVvsd6RG2kvlGmi/dhGY542xow1xozt1q1bTDunlB0ZY4Jz+nEO/XH9OtO/Wz4PvbeeOp8/rs+l7Ku1ob/HmrbButxrtZcDvcO26wVUNNGuVId3qL4Bn9/Ere5OSFZGGr+ePIztBzw89cmXcX0uZV+tDf1ZQGgFzvXAzLD271qreCYA1db0z/vAeSJSYu3APc9qU6rDi3fdnXCnDujKJSNL+dt/v2T7AXfcn0/ZTzRLNl8GFgAniki5iNwEPAScKyKbgHOtrwFmA1uAzcA04BYAY4wT+DWw2Pr/K6tNqQ4vVHcn3ks2Q35+0WCy0tP45ay1GKOlljuajOY2MMZc18hNZ0fY1gC3NvI404HpLeqdUh3A4bo7CRjpA/QozGHqOQP5zb/X8f7aPVwwrGdCnlfZgx6Rq1SSxbuWfiTfO6Uvg3oW8Kt31uLxNiTseVXyaegrlWQuT2JH+gAZ6Wn85rJhVFTX8diczQl7XpV8GvpKJZnL4yU9TSjMaXa2NabG9u3MVSf14pl5W9i8tyahz62SR0NfqSRzuoNH44rEr9haY+6+cBD52Rnc97bu1O0oNPSVSjKX2xu3M2Y1p0unbP73/BNZsOUAs1bqoTMdgYa+Uknm9HjjXnenKdeN68PIXkX85t/rOFjnS1o/VGJo6CuVZK4E1N1pSnqa8OvLhrH/UD2PfLAxaf1QiaGhr1SSuTzBE6gk04hexXxrfB9eXLCNtRVakK0909BXKokCAYPL40vanH64/z1vECV5Wdz39hoCAd2p215p6CuVRDV1DfgDJqlz+iFFeZncM2kwy3ZU8frSnc3fQaUkDX2lkihUdyeZc/rhrhhTxsl9S3jo3fWHy0Oo9kVDX6kkSsbRuE0RCe7UPVjXwB/e35Ds7qg40NBXKolcSai705xBPQu54ZS+vLJ4B8t3uJLdHRVjGvpKJdHhYms2GemHTD33BLoXZHPfzDX4daduu6Khr1QS2W16J6RTdgb3XTyENbsO8tKi7cnujoohDX2lksjp9pGVnkZ+Vnqyu3KMi4Y7OG1AV/74/gb21dQnuzsqRjT0lUoil9tLcV5mUoqtNUdE+NXkodT7Avxu9rpkd0fFiIa+Uknk9CS3BENz+nfrxJSJ/Xlz+S4WbjmQ7O6oGNDQVyqJXO7kFluLxq1nDqCsOJdfzFyDzx9IdndUG2noK5VEdh/pA+RmpfPApUPZuOcQMxboTt1Up6GvVBJVeXyU2KDuTnPOGdKDUwd04W//3azn1E1xGvpKJYk/YKjyeG11YFZT7jjnBPYf8vKPhTraT2Ua+iqpfP7A4QOUOpqDtT4Cxn5r9Bsztm9nTh/Ylac+2YK7Xkf7qUpDXyXVA++sZcJv5/D03C873JGfdiu2Fo07zj0Bp9vLizq3n7I09FXS7K2p47XF5RTmZvLb2ev55rSFlLs8ye5WwoTq7th99U64MX1KOOPEbvx97pcc0tF+StLQV0kzY8F2fIEAr908gT9eOYK1FQe58NF5vLG0HGPa/6jfmYKhD8G5/SqPjxc+25bsrqhW0NBXSeHxNjBj4XbOHdyD/t06cdXY3rx7++kMdhRy5+srueWlZe1+rv9I3R37r94JN7J3MWcP6s7Tc7foidRTkIa+Sop/LS2nyuNjysT+h9t6d87j5SkTuPvCQXy0bg/nPzqX/27Ym8RexpfTHQzMVJrTD7nj3BOorvXx/Kfbkt0V1UIa+irh/AHDM/O2MrpPMScdV/KV29LThB9+/Xhm3noaJXmZfO+5xdz39pp2uTbc5fGSnZFGbqb9iq01Z1hZEecO6cG0eVuortXRfirR0FcJ98Ha3exwephyev9GC40NKS1k1m2n8f3T+jFj4XYufmw+K3ZWJbin8eVyB4/GtWOxtWhMPWcgNXUNTJ+/NdldUS3QptAXkW0islpEVojIEquts4h8KCKbrMsSq11E5DER2Swiq0RkTCy+AZV6ps3bQp/OeZw3tGeT2+VkpvPzi4fwz++Pp87n54onP+PRjza2m/ovLo/96+40ZWhpERcM7cn0+Vup9uhoP1XEYqR/pjFmlDFmrPX13cAcY8xAYI71NcCFwEDr/xTgyRg8d7uydLuTO19b2a4PfFm63cmyHVV8//R+pKdFN8I9ZUBX3p06kUtHlvLoR5u48qkFbNl3KM49jT+n2/51d5oz9dyB1NQ38Mz8LcnuiopSPKZ3JgMvWNdfAC4La3/RBC0EikXEEYfnT0nVtT5u++dy3lhWzm/+3X5rlz89dwvFeZlceVKvFt2vKDeTP18zir9+czTb9ruZ9Ng8ZizcntJLO10eX8ocjduYQT0LuWi4g+nztx4+7kDZW1tD3wAfiMhSEZlitfUwxlQCWJfdrfYyYGfYfcutNkXwyNS9NfWcP7QHL3++gznr9iS7SzG3db+bD77Yw7fHH0deVkarHuPiEaW8P3UiJ/ftzH1vr+H65xaz4MsDBFLwaF6n20vnvNRarhnJ7ecMxOPzM22ejvZTQVtD/1RjzBiCUze3isjEJraN9Fn+mN9UEZkiIktEZMm+ffva2L3U8P7a3by5bBe3nnE8j103mkE9C/jpG6s4cKh9naLu2flbyExL47unHNemx+lZlMOLN47jgUuHsny7i+umLeTrf/qYv3y0KWWO6G3wB6iu9VGcwnP6ISf0KOCSEaU8/9m2dveebY/aFPrGmArrci/wFjAO2BOatrEuQwuty4HeYXfvBVREeMynjTFjjTFju3Xr1pbupYQDh+q5963VDC0t5LazBpKdkc6j147iYG0D97y5OqWnL8IdOFTP60vKuXx0Gd0Lctr8eCLC9af05fN7z+HRa0bRuySPP3+0kdP/8DHffmYRM1fsos7nj0HP46OqNnXX6Efy47MHUufz87SO9m2v1aEvIvkiUhC6DpwHrAFmAddbm10PzLSuzwK+a63imQBUh6aBOipjDPe+tYaDtQ08cvUosjKCP45BPQv53/NP5IMv9vCvpeVJ7mVs/GPhDuobAnz/9H4xfdzcrHQuG13GP38wgXl3ncmPzxrI1v1ubn9lBSc/+BH3vrWalTurbPfH83DdnXYS+gO6d2LyqDJe/Gy7nkTd5toy0u8BzBeRlcDnwL+NMe8BDwHnisgm4Fzra4DZwBZgMzANuKUNz90uzFxRwXtrd/M/553AiT0LvnLbTaf1Y0L/zjzwzhfsdKbGlEVj6nx+XlywjbMGdWdgj4Jmt2+t3p3zuOPcE5h315n88/vjOWdwD/61tJzJT3zK+Y/OZdrcLbYJpFCJiVSppR+NH501gPoGP3//5Mtkd0U1odWhb4zZYowZaf0faox50Go/YIw52xgz0Lp0Wu3GGHOrMeZ4Y8xwY8ySWH0TqWh3dR2/mLmGk44r4Qen9z/m9rQ04U9XjUSAO19bmdJlh99ctosDbm/E7zMe0tKEUwZ05c/XjGLxz8/ht5cPJz87gwdnr+Nrv5vDD15cwgdrdyd1vX+q1t1pSv9unbh8dC9mLNzO3oN1ye6OaoQekZsExhjuemMVPr/h4atGNrpevVdJHg9MHsrn25wpuzIiEDA8M28Lw8uKmNC/c8KfvzAnk2+O78Nbt5zKR/8zkZtO68eKnVVMmbGUr/3uP8zblJzFAi5P+5rTD/nx2QNoCBie1NG+bWnoJ8E/P9/B3I37+NmkQfTtmt/ktpePLmPS8J48/MEGvqg4mKAexs6c9XvZst/NDyY2XnIhUQZ0L+CeSYNZcPdZPHv9WLrkZ3HzjKWsKk98eYdULavcnOO65HPFmDJeWrSDPTratyUN/aM0+AP89T+beHv5rrg8/vYDbh789zpOH9iVb09ofumiiPDgZcMpzsvijldX2HpFSiTT5m6hrDiXScOaLrmQSBnpaZw9uAczbhpH5/wsbnhuMVv3uxPaB5fbS15WOjkpWGytOT86ayCBgOFvH29OdldUBBr6YWrqfHz/xSX86YONTH11BT9/ezXehtjN+/oDhp+8vpL0NOH3V4yIeuRbkp/FH64cwYY9NTz8wYaY9SfeVuys4vNtTm48rR8Z6fZ7q3UvDK73N8B3py9ib03iRqbOFK+705TenfO4amwvXv58J5XVtUnrx/5D9by0aDv3z1rL0u2upPXDbuz3m5gku6pqueqpBczbtJ9fXzaMmyf25x8Ld/CtZxbGLAymz9/K4m0u7r9kKKXFuS2675kndufbE/rwzPytLPjyQEz6E2/T5m2hICeDa07u3fzGSdK/Wyemf+9k9td4ueG5xdQk6KQgLre3Xe3EPdqtZw7AYHgiwaP9PQfreHHBNq59egHjHvyIe99aw0uLtnPFk59x2ROf8s7KChraScG+1tLQB1aVV3HZE5+yy1XLc987me9MOI57Jg3msetGs3pXNZc+/mmby/pu3FPDHz/YwHlDevCNMa2rPvGzSYPp2yWfn7y+0vZnLNrp9PDu6kq+Nf44OmW3ruRCoozqXcyT3x7Dht01/PAfS2P66a4xTo+v3Y70IbgI4eqxvXl18U52VcV3tF9RVcuz87dy1VOfMeF3c/jFzLUcOOTltrMG8t7U01nxi/N44NKhVHm8/Ojl5Uz8w8f8/ZMvO+x5AMRuB62EGzt2rFmyJL4rO99bs5upry6nS342z91wMicctY78i4qDTJmxhL019fzmsmFcPbblo1afP8A3/vYZu6pq+eCOiXTtlN3q/i7f4eLKpxYweVQpj1w9qtWPE2/3z1rLS4u2M++us+hZ1PYjcBPhjaXl3Pn6ymA1z2tGkRZlFdDWmPiHjxndp5i/XDs6bs+RbBVVtZzxx/9yxUm9+N03hsf0sXc6Pby7ppLZq3cfHpAN6lnApOEOLhzWM+LxIIGA4T/r9/Ls/K0s2HKAvKx0rjypFzec2o9+zSyoSDUisjSs8vFX2HsIFkfGGJ6eu4WH3lvPyF7FTPvuWLoVHBvGQ0oLeee207jt5WXc9a9VrNlVzX0XDyGzBXPUT3y8mdW7qnnq22PaFPgAo/uUcNuZA/jLnE2cM7gHk4bbr1BplcfLa0t2csnI0pQJfIArTurFvkP1PPTuerp2yua+iwfHbcWRy91+5/RDSotzuXZcb/65aAe3nHE8vTvntenxtu538+6aSt5dvZvVu6oBGF5WxF0XnMiFwxzNBndamnDOkB6cM6QHayuqmT5/Gy9/voMZC7dz9qDu3HhaP77Wv0vSV5nFW4cMfZ8/wLg9jDMAAA2FSURBVC9mruHlz3dy0XAHD189sslVFCX5Wbxwwzh+/956ps3byvrdNfztW9EF+Oryav76n81cPrqMC4bFJqBvO2sAH2/Yy8/eWs3Y40roXmivYH1p0Q48Xn/CDsaKpZsn9mfvwXqmf7qVHoXZ3Pz142P+HN6GADX1De1ujX4kt5wxgFcW7+Sv/9nM768c0ez2dT4/u6vrqKiupbKqjsrqWiqq61i23cX63TVAcDruZ5MGceEwR6v/kAwtLeLhq0fy0wtP5B8LtvOPRTv4aNoihjgKufG0flwy0kF2RvtbWQUdcHqnutbHrS8tY/7m/dx65vHcee6JLfoYP3PFLn76xipK8rL4+3dOYkSv4ka3rfP5ueTx+dTUNfD+1IkUxbCM7pf7DnHRY/MY368Lz99wsm1GJ/UNfk77/ccM6lnAjJvGJ7s7rRIIGG5/dQXvrKzgkatH8o0xLav935y9NXWMe3AOv75sGN+JYtluqrt/1lpmLNzOB3dMJDsjjcrqOiqqaqmsrqOyKhjqlVbIH4hQk79zfhYDunfigqE9uWBYzxYvgohGnc/P28t3Mf3TrWzcc4huBdl8Z8JxfGt8H7q08dN5Muj0jmWn08MNzy9m+wE3f7xyBFe1Yn5+8qgyju/WiZtnLOXKpxbw28uHN3pCkEc+3MimvYd44cZxMQ18gOO7deJnkwbzi5lr+ceiHbYJj5krKthXU88jV49MdldaLVgCYwROdz13/WsVnfOzOOPE7s3fMUout3U0bjuf3gm55YzjefnzHZz98CfH3FaQk0FpUS6O4hyGlxVTWpSDozj38KWjKCchxzLkZKZz7bg+XHNyb+Zt2s+z87fyyIcbeeLjzZwzpAeTR5ZyxondDxdFTGUdJvSXbncx5cUlNAQML944nq8d36XVjzWsrIh3fnQat/1zGT95fSVrdlVz70WDvzLP//nWYOmEb47vw9dPiE+J6O9MOI6P1u3lt/9ex6nHd6F/t05xeZ5oGWOYNncLg3oWcNqArkntS1tlZ6Tz1LdP4tqnF3LLS8t4+QcTGNm78U91LXH4aNx2vGQzXPfCHP5y7Wi+qDx4TKjbbWWXiDDxhG5MPKEbm/fWMGPBdt5ZVcm/V1VSlJvJpOE9uXRkGeP7dY7rjv546hDTO++srODO11fiKMph+vdO5vgYhWODP8Dv3l3Ps/O3Mr5fZ56w5vnd9Q1c+Jd5ALx7++nkx/GNvedgHef9eS59u+bzxg+/ltSDoD7esJcbnlsclymRZNlbU8cVT36Gu97PG//vlJis8pi9upJbXlrGe1NPZ1DPwhj0UsWTzx/g0837mbmigvfX7sbj9dOzMIdLRjqYPKqMoaWFtpleDWlqeif1P6s0wRjD43M28aOXlzOyVxFv3XJqzAIfgofz33fxEB69ZhQrdlZx6ePzWV1ezW9nr2Ony8OfrhoZ18AH6FGYw28vH87KnVU88XFyi1xNm7uFnoU5XDyiNKn9iKXuBTm8eON4hNgdtdte6+60V5npaZxxYnf+fM0olv78XB6/bjTDyop4/rNtXPz4fM555BMem7OJbQku5dFa9vpsFUP1DX7ueXM1by7bxeWjy3joiuFx2xt/2egyBnQPzvNf8dRneBsC/OD0fozrl5iqkheNcPDRujIe+88mvqisZkyfEkb3KWFEr6KE1XZZs6uaz748wD0XDmoX857h+nXNZ/r3Tua6aQv53vTFvHrzBApyWj81EzqBSnE7OD9uR5Oblc4lI0u5ZGQpVR4vs1fvZuaKXTzy4UYe+XAjI3sXc9moUi4a4YjJGeLioV1O71R5vEyZsZTPtzq545wT+PHZAxLy8evAoXqmvrqC6lofr938tYQW0zpY5+PB/1vHwq0H2H4geNKVjDRhSGkho3sXM+a4Esb0KaFXSW5cXovbX1nOnHV7+eyesyhsQyDa2Scb93HT84sZ168zz91wcqsHEQ+8s5bXl5Sz5oHzY9xDlSwVVbX836oKZq6oYG3FQdIETh3QlVMHdGVQzwIGOwrpXpCdsGmgpqZ32mXo7z9UzzV/X8CPzx7I5FGtK3nQFsaYpM7x7T9Uz/IdVSzf4WLZDheryqvxeIPVObt2ymZ0n2Lr00AxI3oVkZfVtg98u6pqmfiHj7nhlL78/OIhsfgWbOvNZeX8z2sruXiEg8eso2k9Pj+e+gbcXj/u+gY8Xj9ubwOe+tBl8DaPtwF3vZ+5G/fhCwSYd9dZSf5uVDxs3lvDrBUVvLOq8ivVWzvnZzGoZwGDehYyyFHA4J6FDOzRKS6Dww4X+hDc+dKSo2bbswZ/gA17ali+o4plO1ws31F1+M2YniYM6lnA6D7FlORlYQwEjMEAxgT/gBmCa9cN1m3WWyZ0fcPuGpbucDH3rjMpi8Maarv5+ydf8rt315OdkUZ9C+r0pKcJ+Vnp5GdncNFwR7v/A6mg2uNj/e6DrKs8yPrdNazbXcPG3TXUWiXS0yQ4fTjIUcjgsD8IZcVt+0TeIUNfNc3l9rJ8p+vwH4KVO6txextIE0EAkeDytdD1UHuaCAT/kZYWul24fHQZ93WQEDPG8PqScjbtrSEvK4P87PSvXlrX87MzyMtKJz8rg7zsdLLS02y3ykMlnj9g2OH0sL7yIOt217De+oOwI+xc2AXZGZwxqDuPX9e62kwa+kopZXOH6hvYsLuG9bsPsr6yhoKcDO66YFCrHkuPyFVKKZvrlJ3BSceVcNJxJXF9Hp30VkqpDkRDXymlOhANfaWU6kA09JVSqgPR0FdKqQ5EQ18ppToQDX2llOpANPSVUqoDsfURuSKyD9jehofoCuyPUXdiSfvVMtqvltF+tUx77NdxxpiIp+yzdei3lYgsaexQ5GTSfrWM9qtltF8t09H6pdM7SinVgWjoK6VUB9LeQ//pZHegEdqvltF+tYz2q2U6VL/a9Zy+Ukqpr2rvI32llFJhNPSVUqoDSfnQF5ELRGSDiGwWkbsj3J4tIq9aty8Skb4J6FNvEflYRNaJyFoRuT3CNmeISLWIrLD+/yLe/Qp77m0istp63mNOTSZBj1mv2SoRGZOAPp0Y9lqsEJGDIjL1qG0S8pqJyHQR2Ssia8LaOovIhyKyybqMeKYLEbne2maTiFyfgH79UUTWWz+nt0SkuJH7Nvkzj0O/7heRXWE/q0mN3LfJ39849OvVsD5tE5EVjdw3nq9XxHxI2HvMGJOy/4F04EugP5AFrASGHLXNLcBT1vVrgVcT0C8HMMa6XgBsjNCvM4D/S9Lrtg3o2sTtk4B3CZ4KdwKwKAk/190EDzBJ+GsGTATGAGvC2v4A3G1dvxv4fYT7dQa2WJcl1vWSOPfrPCDDuv77SP2K5mceh37dD/wkip9zk7+/se7XUbc/DPwiCa9XxHxI1Hss1Uf644DNxpgtxhgv8Aow+ahtJgMvWNf/BZwtcT47tTGm0hizzLpeA6wDyuL5nDE2GXjRBC0EikXEkcDnPxv40hjTlqOxW80YMxdwHtUc/j56Abgswl3PBz40xjiNMS7gQ+CCePbLGPOBMabB+nIh0CtWz9eWfkUpmt/fuPTLyoCrgZdj9XzRaiIfEvIeS/XQLwN2hn1dzrHhengb65ejGuiSkN4B1nTSaGBRhJu/JiIrReRdERmaqD4BBvhARJaKyJQIt0fzusbTtTT+y5is16yHMaYSgr+0QPcI2yT7dbuR4Ce0SJr7mcfDbda00/RGpiqS+XqdDuwxxmxq5PaEvF5H5UNC3mOpHvqRRuxHr0GNZpu4EJFOwBvAVGPMwaNuXkZw+mIk8DjwdiL6ZDnVGDMGuBC4VUQmHnV7Ml+zLOBS4PUINyfzNYtGMl+3e4EG4KVGNmnuZx5rTwLHA6OASoJTKUdL2usFXEfTo/y4v17N5EOjd4vQ1qLXLNVDvxzoHfZ1L6CisW1EJAMoonUfRVtERDIJ/kBfMsa8efTtxpiDxphD1vXZQKaIdI13v6znq7Au9wJvEfyYHS6a1zVeLgSWGWP2HH1DMl8zYE9oisu63Bthm6S8btbOvIuBbxlr4vdoUfzMY8oYs8cY4zfGBIBpjTxfsl6vDOAbwKuNbRPv16uRfEjIeyzVQ38xMFBE+lkjxGuBWUdtMwsI7eG+EvhPY78YsWLNFz4LrDPGPNLINj1D+xZEZBzBn8WBePbLeq58ESkIXSe4I3DNUZvNAr4rQROA6tDHzgRodASWrNfMEv4+uh6YGWGb94HzRKTEms44z2qLGxG5APgpcKkxxtPINtH8zGPdr/B9QJc38nzR/P7GwznAemNMeaQb4/16NZEPiXmPxWPvdCL/E1xpspHgKoB7rbZfEfwlAMghOFWwGfgc6J+APp1G8CPXKmCF9X8S8EPgh9Y2twFrCa5YWAickqDXq7/1nCut5w+9ZuF9E+AJ6zVdDYxNUN/yCIZ4UVhbwl8zgn90KgEfwZHVTQT3A80BNlmXna1txwLPhN33Ruu9thm4IQH92kxwjjf0PgutVCsFZjf1M49zv2ZY751VBMPMcXS/rK+P+f2NZ7+s9udD76mwbRP5ejWWDwl5j2kZBqWU6kBSfXpHKaVUC2joK6VUB6Khr5RSHYiGvlJKdSAa+kop1YFo6CulVAeioa+UUh3I/wcsDJUzJL5u0AAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(len(loss_list)),loss_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 批量，小批量"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
